Commit 5d5db1c9 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by David S. Miller

docs: sparc: convert to ReST

Rename the sparc documentation files to ReST, add an
index for them and adjust in order to produce a nice html
output via the Sphinx build system.

There is an except from a document under oradax dir.
It doesn't seem to make much sense to convert this one
to ReST, so let's add it as an included document.

At its new index.rst, let's add a :orphan: while this is not linked to
the main index.rst file, in order to avoid build warnings.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dac21527
================================
Application Data Integrity (ADI) Application Data Integrity (ADI)
================================ ================================
...@@ -44,12 +45,15 @@ provided by the hypervisor to the kernel. Kernel returns the value of ...@@ -44,12 +45,15 @@ provided by the hypervisor to the kernel. Kernel returns the value of
ADI block size to userspace using auxiliary vector along with other ADI ADI block size to userspace using auxiliary vector along with other ADI
info. Following auxiliary vectors are provided by the kernel: info. Following auxiliary vectors are provided by the kernel:
============ ===========================================
AT_ADI_BLKSZ ADI block size. This is the granularity and AT_ADI_BLKSZ ADI block size. This is the granularity and
alignment, in bytes, of ADI versioning. alignment, in bytes, of ADI versioning.
AT_ADI_NBITS Number of ADI version bits in the VA AT_ADI_NBITS Number of ADI version bits in the VA
============ ===========================================
IMPORTANT NOTES: IMPORTANT NOTES
===============
- Version tag values of 0x0 and 0xf are reserved. These values match any - Version tag values of 0x0 and 0xf are reserved. These values match any
tag in virtual address and never generate a mismatch exception. tag in virtual address and never generate a mismatch exception.
...@@ -86,11 +90,12 @@ IMPORTANT NOTES: ...@@ -86,11 +90,12 @@ IMPORTANT NOTES:
ADI related traps ADI related traps
----------------- =================
With ADI enabled, following new traps may occur: With ADI enabled, following new traps may occur:
Disrupting memory corruption Disrupting memory corruption
----------------------------
When a store accesses a memory localtion that has TTE.mcd=1, When a store accesses a memory localtion that has TTE.mcd=1,
the task is running with ADI enabled (PSTATE.mcde=1), and the ADI the task is running with ADI enabled (PSTATE.mcde=1), and the ADI
...@@ -100,7 +105,7 @@ Disrupting memory corruption ...@@ -100,7 +105,7 @@ Disrupting memory corruption
first. Hypervisor creates a sun4v error report and sends a first. Hypervisor creates a sun4v error report and sends a
resumable error (TT=0x7e) trap to the kernel. The kernel sends resumable error (TT=0x7e) trap to the kernel. The kernel sends
a SIGSEGV to the task that resulted in this trap with the following a SIGSEGV to the task that resulted in this trap with the following
info: info::
siginfo.si_signo = SIGSEGV; siginfo.si_signo = SIGSEGV;
siginfo.errno = 0; siginfo.errno = 0;
...@@ -110,6 +115,7 @@ Disrupting memory corruption ...@@ -110,6 +115,7 @@ Disrupting memory corruption
Precise memory corruption Precise memory corruption
-------------------------
When a store accesses a memory location that has TTE.mcd=1, When a store accesses a memory location that has TTE.mcd=1,
the task is running with ADI enabled (PSTATE.mcde=1), and the ADI the task is running with ADI enabled (PSTATE.mcde=1), and the ADI
...@@ -118,7 +124,7 @@ Precise memory corruption ...@@ -118,7 +124,7 @@ Precise memory corruption
MCD precise exception is enabled (MCDPERR=1), a precise MCD precise exception is enabled (MCDPERR=1), a precise
exception is sent to the kernel with TT=0x1a. The kernel sends exception is sent to the kernel with TT=0x1a. The kernel sends
a SIGSEGV to the task that resulted in this trap with the following a SIGSEGV to the task that resulted in this trap with the following
info: info::
siginfo.si_signo = SIGSEGV; siginfo.si_signo = SIGSEGV;
siginfo.errno = 0; siginfo.errno = 0;
...@@ -126,17 +132,19 @@ Precise memory corruption ...@@ -126,17 +132,19 @@ Precise memory corruption
siginfo.si_addr = addr; /* address that caused trap */ siginfo.si_addr = addr; /* address that caused trap */
siginfo.si_trapno = 0; siginfo.si_trapno = 0;
NOTE: ADI tag mismatch on a load always results in precise trap. NOTE:
ADI tag mismatch on a load always results in precise trap.
MCD disabled MCD disabled
------------
When a task has not enabled ADI and attempts to set ADI version When a task has not enabled ADI and attempts to set ADI version
on a memory address, processor sends an MCD disabled trap. This on a memory address, processor sends an MCD disabled trap. This
trap is handled by hypervisor first and the hypervisor vectors this trap is handled by hypervisor first and the hypervisor vectors this
trap through to the kernel as Data Access Exception trap with trap through to the kernel as Data Access Exception trap with
fault type set to 0xa (invalid ASI). When this occurs, the kernel fault type set to 0xa (invalid ASI). When this occurs, the kernel
sends the task SIGSEGV signal with following info: sends the task SIGSEGV signal with following info::
siginfo.si_signo = SIGSEGV; siginfo.si_signo = SIGSEGV;
siginfo.errno = 0; siginfo.errno = 0;
...@@ -149,35 +157,35 @@ Sample program to use ADI ...@@ -149,35 +157,35 @@ Sample program to use ADI
------------------------- -------------------------
Following sample program is meant to illustrate how to use the ADI Following sample program is meant to illustrate how to use the ADI
functionality. functionality::
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <elf.h> #include <elf.h>
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <asm/asi.h> #include <asm/asi.h>
#ifndef AT_ADI_BLKSZ #ifndef AT_ADI_BLKSZ
#define AT_ADI_BLKSZ 48 #define AT_ADI_BLKSZ 48
#endif #endif
#ifndef AT_ADI_NBITS #ifndef AT_ADI_NBITS
#define AT_ADI_NBITS 49 #define AT_ADI_NBITS 49
#endif #endif
#ifndef PROT_ADI #ifndef PROT_ADI
#define PROT_ADI 0x10 #define PROT_ADI 0x10
#endif #endif
#define BUFFER_SIZE 32*1024*1024UL #define BUFFER_SIZE 32*1024*1024UL
main(int argc, char* argv[], char* envp[]) main(int argc, char* argv[], char* envp[])
{ {
unsigned long i, mcde, adi_blksz, adi_nbits; unsigned long i, mcde, adi_blksz, adi_nbits;
char *shmaddr, *tmp_addr, *end, *veraddr, *clraddr; char *shmaddr, *tmp_addr, *end, *veraddr, *clraddr;
int shmid, version; int shmid, version;
Elf64_auxv_t *auxv; Elf64_auxv_t *auxv;
adi_blksz = 0; adi_blksz = 0;
...@@ -202,77 +210,77 @@ main(int argc, char* argv[], char* envp[]) ...@@ -202,77 +210,77 @@ main(int argc, char* argv[], char* envp[])
printf("\tBlock size = %ld\n", adi_blksz); printf("\tBlock size = %ld\n", adi_blksz);
printf("\tNumber of bits = %ld\n", adi_nbits); printf("\tNumber of bits = %ld\n", adi_nbits);
if ((shmid = shmget(2, BUFFER_SIZE, if ((shmid = shmget(2, BUFFER_SIZE,
IPC_CREAT | SHM_R | SHM_W)) < 0) { IPC_CREAT | SHM_R | SHM_W)) < 0) {
perror("shmget failed"); perror("shmget failed");
exit(1); exit(1);
} }
shmaddr = shmat(shmid, NULL, 0); shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) { if (shmaddr == (char *)-1) {
perror("shm attach failed"); perror("shm attach failed");
shmctl(shmid, IPC_RMID, NULL); shmctl(shmid, IPC_RMID, NULL);
exit(1); exit(1);
} }
if (mprotect(shmaddr, BUFFER_SIZE, PROT_READ|PROT_WRITE|PROT_ADI)) { if (mprotect(shmaddr, BUFFER_SIZE, PROT_READ|PROT_WRITE|PROT_ADI)) {
perror("mprotect failed"); perror("mprotect failed");
goto err_out; goto err_out;
} }
/* Set the ADI version tag on the shm segment /* Set the ADI version tag on the shm segment
*/ */
version = 10; version = 10;
tmp_addr = shmaddr; tmp_addr = shmaddr;
end = shmaddr + BUFFER_SIZE; end = shmaddr + BUFFER_SIZE;
while (tmp_addr < end) { while (tmp_addr < end) {
asm volatile( asm volatile(
"stxa %1, [%0]0x90\n\t" "stxa %1, [%0]0x90\n\t"
: :
: "r" (tmp_addr), "r" (version)); : "r" (tmp_addr), "r" (version));
tmp_addr += adi_blksz; tmp_addr += adi_blksz;
} }
asm volatile("membar #Sync\n\t"); asm volatile("membar #Sync\n\t");
/* Create a versioned address from the normal address by placing /* Create a versioned address from the normal address by placing
* version tag in the upper adi_nbits bits * version tag in the upper adi_nbits bits
*/ */
tmp_addr = (void *) ((unsigned long)shmaddr << adi_nbits); tmp_addr = (void *) ((unsigned long)shmaddr << adi_nbits);
tmp_addr = (void *) ((unsigned long)tmp_addr >> adi_nbits); tmp_addr = (void *) ((unsigned long)tmp_addr >> adi_nbits);
veraddr = (void *) (((unsigned long)version << (64-adi_nbits)) veraddr = (void *) (((unsigned long)version << (64-adi_nbits))
| (unsigned long)tmp_addr); | (unsigned long)tmp_addr);
printf("Starting the writes:\n"); printf("Starting the writes:\n");
for (i = 0; i < BUFFER_SIZE; i++) { for (i = 0; i < BUFFER_SIZE; i++) {
veraddr[i] = (char)(i); veraddr[i] = (char)(i);
if (!(i % (1024 * 1024))) if (!(i % (1024 * 1024)))
printf("."); printf(".");
} }
printf("\n"); printf("\n");
printf("Verifying data..."); printf("Verifying data...");
fflush(stdout); fflush(stdout);
for (i = 0; i < BUFFER_SIZE; i++) for (i = 0; i < BUFFER_SIZE; i++)
if (veraddr[i] != (char)i) if (veraddr[i] != (char)i)
printf("\nIndex %lu mismatched\n", i); printf("\nIndex %lu mismatched\n", i);
printf("Done.\n"); printf("Done.\n");
/* Disable ADI and clean up /* Disable ADI and clean up
*/ */
if (mprotect(shmaddr, BUFFER_SIZE, PROT_READ|PROT_WRITE)) { if (mprotect(shmaddr, BUFFER_SIZE, PROT_READ|PROT_WRITE)) {
perror("mprotect failed"); perror("mprotect failed");
goto err_out; goto err_out;
} }
if (shmdt((const void *)shmaddr) != 0) if (shmdt((const void *)shmaddr) != 0)
perror("Detach failure"); perror("Detach failure");
shmctl(shmid, IPC_RMID, NULL); shmctl(shmid, IPC_RMID, NULL);
exit(0); exit(0);
err_out: err_out:
if (shmdt((const void *)shmaddr) != 0) if (shmdt((const void *)shmaddr) != 0)
perror("Detach failure"); perror("Detach failure");
shmctl(shmid, IPC_RMID, NULL); shmctl(shmid, IPC_RMID, NULL);
exit(1); exit(1);
} }
Steps for sending 'break' on sunhv console: Steps for sending 'break' on sunhv console
=========================================== ==========================================
On Baremetal: On Baremetal:
1. press Esc + 'B' 1. press Esc + 'B'
......
:orphan:
==================
Sparc Architecture
==================
.. toctree::
:maxdepth: 1
console
adi
oradax/oracle-dax
=======================================
Oracle Data Analytics Accelerator (DAX) Oracle Data Analytics Accelerator (DAX)
--------------------------------------- =======================================
DAX is a coprocessor which resides on the SPARC M7 (DAX1) and M8 DAX is a coprocessor which resides on the SPARC M7 (DAX1) and M8
(DAX2) processor chips, and has direct access to the CPU's L3 caches (DAX2) processor chips, and has direct access to the CPU's L3 caches
...@@ -17,6 +18,7 @@ code sufficient to write user or kernel applications that use DAX ...@@ -17,6 +18,7 @@ code sufficient to write user or kernel applications that use DAX
functionality. functionality.
The user library is open source and available at: The user library is open source and available at:
https://oss.oracle.com/git/gitweb.cgi?p=libdax.git https://oss.oracle.com/git/gitweb.cgi?p=libdax.git
The Hypervisor interface to the coprocessor is described in detail in The Hypervisor interface to the coprocessor is described in detail in
...@@ -26,7 +28,7 @@ Specification" version 3.0.20+15, dated 2017-09-25. ...@@ -26,7 +28,7 @@ Specification" version 3.0.20+15, dated 2017-09-25.
High Level Overview High Level Overview
------------------- ===================
A coprocessor request is described by a Command Control Block A coprocessor request is described by a Command Control Block
(CCB). The CCB contains an opcode and various parameters. The opcode (CCB). The CCB contains an opcode and various parameters. The opcode
...@@ -52,7 +54,7 @@ thread. ...@@ -52,7 +54,7 @@ thread.
Addressing Memory Addressing Memory
----------------- =================
The kernel does not have access to physical memory in the Sun4v The kernel does not have access to physical memory in the Sun4v
architecture, as there is an additional level of memory virtualization architecture, as there is an additional level of memory virtualization
...@@ -77,7 +79,7 @@ the request. ...@@ -77,7 +79,7 @@ the request.
The Driver API The Driver API
-------------- ==============
An application makes requests to the driver via the write() system An application makes requests to the driver via the write() system
call, and gets results (if any) via read(). The completion areas are call, and gets results (if any) via read(). The completion areas are
...@@ -108,6 +110,7 @@ equal to the number of bytes given in the call. Otherwise -1 is ...@@ -108,6 +110,7 @@ equal to the number of bytes given in the call. Otherwise -1 is
returned and errno is set. returned and errno is set.
CCB_DEQUEUE CCB_DEQUEUE
-----------
Tells the driver to clean up resources associated with past Tells the driver to clean up resources associated with past
requests. Since no interrupt is generated upon the completion of a requests. Since no interrupt is generated upon the completion of a
...@@ -116,12 +119,14 @@ further status information is returned, so the user should not ...@@ -116,12 +119,14 @@ further status information is returned, so the user should not
subsequently call read(). subsequently call read().
CCB_KILL CCB_KILL
--------
Kills a CCB during execution. The CCB is guaranteed to not continue Kills a CCB during execution. The CCB is guaranteed to not continue
executing once this call returns successfully. On success, read() must executing once this call returns successfully. On success, read() must
be called to retrieve the result of the action. be called to retrieve the result of the action.
CCB_INFO CCB_INFO
--------
Retrieves information about a currently executing CCB. Note that some Retrieves information about a currently executing CCB. Note that some
Hypervisors might return 'notfound' when the CCB is in 'inprogress' Hypervisors might return 'notfound' when the CCB is in 'inprogress'
...@@ -130,6 +135,7 @@ CCB_KILL must be invoked on that CCB. Upon success, read() must be ...@@ -130,6 +135,7 @@ CCB_KILL must be invoked on that CCB. Upon success, read() must be
called to retrieve the details of the action. called to retrieve the details of the action.
Submission of an array of CCBs for execution Submission of an array of CCBs for execution
---------------------------------------------
A write() whose length is a multiple of the CCB size is treated as a A write() whose length is a multiple of the CCB size is treated as a
submit operation. The file offset is treated as the index of the submit operation. The file offset is treated as the index of the
...@@ -146,6 +152,7 @@ status will reflect the error caused by the first CCB that was not ...@@ -146,6 +152,7 @@ status will reflect the error caused by the first CCB that was not
accepted, and status_data will provide additional data in some cases. accepted, and status_data will provide additional data in some cases.
MMAP MMAP
----
The mmap() function provides access to the completion area allocated The mmap() function provides access to the completion area allocated
in the driver. Note that the completion area is not writeable by the in the driver. Note that the completion area is not writeable by the
...@@ -153,7 +160,7 @@ user process, and the mmap call must not specify PROT_WRITE. ...@@ -153,7 +160,7 @@ user process, and the mmap call must not specify PROT_WRITE.
Completion of a Request Completion of a Request
----------------------- =======================
The first byte in each completion area is the command status which is The first byte in each completion area is the command status which is
updated by the coprocessor hardware. Software may take advantage of updated by the coprocessor hardware. Software may take advantage of
...@@ -172,7 +179,7 @@ and resumption of execution may be just a few nanoseconds. ...@@ -172,7 +179,7 @@ and resumption of execution may be just a few nanoseconds.
Application Life Cycle of a DAX Submission Application Life Cycle of a DAX Submission
------------------------------------------ ==========================================
- open dax device - open dax device
- call mmap() to get the completion area address - call mmap() to get the completion area address
...@@ -187,7 +194,7 @@ Application Life Cycle of a DAX Submission ...@@ -187,7 +194,7 @@ Application Life Cycle of a DAX Submission
Memory Constraints Memory Constraints
------------------ ==================
The DAX hardware operates only on physical addresses. Therefore, it is The DAX hardware operates only on physical addresses. Therefore, it is
not aware of virtual memory mappings and the discontiguities that may not aware of virtual memory mappings and the discontiguities that may
...@@ -226,7 +233,7 @@ CCB Structure ...@@ -226,7 +233,7 @@ CCB Structure
------------- -------------
A CCB is an array of 8 64-bit words. Several of these words provide A CCB is an array of 8 64-bit words. Several of these words provide
command opcodes, parameters, flags, etc., and the rest are addresses command opcodes, parameters, flags, etc., and the rest are addresses
for the completion area, output buffer, and various inputs: for the completion area, output buffer, and various inputs::
struct ccb { struct ccb {
u64 control; u64 control;
...@@ -252,7 +259,7 @@ The first word (control) is examined by the driver for the following: ...@@ -252,7 +259,7 @@ The first word (control) is examined by the driver for the following:
Example Code Example Code
------------ ============
The DAX is accessible to both user and kernel code. The kernel code The DAX is accessible to both user and kernel code. The kernel code
can make hypercalls directly while the user code must use wrappers can make hypercalls directly while the user code must use wrappers
...@@ -265,7 +272,7 @@ arch/sparc/include/uapi/asm/oradax.h must be included. ...@@ -265,7 +272,7 @@ arch/sparc/include/uapi/asm/oradax.h must be included.
First, the proper device must be opened. For M7 it will be First, the proper device must be opened. For M7 it will be
/dev/oradax1 and for M8 it will be /dev/oradax2. The simplest /dev/oradax1 and for M8 it will be /dev/oradax2. The simplest
procedure is to attempt to open both, as only one will succeed: procedure is to attempt to open both, as only one will succeed::
fd = open("/dev/oradax1", O_RDWR); fd = open("/dev/oradax1", O_RDWR);
if (fd < 0) if (fd < 0)
...@@ -273,7 +280,7 @@ procedure is to attempt to open both, as only one will succeed: ...@@ -273,7 +280,7 @@ procedure is to attempt to open both, as only one will succeed:
if (fd < 0) if (fd < 0)
/* No DAX found */ /* No DAX found */
Next, the completion area must be mapped: Next, the completion area must be mapped::
completion_area = mmap(NULL, DAX_MMAP_LEN, PROT_READ, MAP_SHARED, fd, 0); completion_area = mmap(NULL, DAX_MMAP_LEN, PROT_READ, MAP_SHARED, fd, 0);
...@@ -295,7 +302,7 @@ is the input bitmap inverted. ...@@ -295,7 +302,7 @@ is the input bitmap inverted.
For details of all the parameters and bits used in this CCB, please For details of all the parameters and bits used in this CCB, please
refer to section 36.2.1.3 of the DAX Hypervisor API document, which refer to section 36.2.1.3 of the DAX Hypervisor API document, which
describes the Scan command in detail. describes the Scan command in detail::
ccb->control = /* Table 36.1, CCB Header Format */ ccb->control = /* Table 36.1, CCB Header Format */
(2L << 48) /* command = Scan Value */ (2L << 48) /* command = Scan Value */
...@@ -326,7 +333,7 @@ describes the Scan command in detail. ...@@ -326,7 +333,7 @@ describes the Scan command in detail.
The CCB submission is a write() or pwrite() system call to the The CCB submission is a write() or pwrite() system call to the
driver. If the call fails, then a read() must be used to retrieve the driver. If the call fails, then a read() must be used to retrieve the
status: status::
if (pwrite(fd, ccb, 64, 0) != 64) { if (pwrite(fd, ccb, 64, 0) != 64) {
struct ccb_exec_result status; struct ccb_exec_result status;
...@@ -337,7 +344,7 @@ status: ...@@ -337,7 +344,7 @@ status:
After a successful submission of the CCB, the completion area may be After a successful submission of the CCB, the completion area may be
polled to determine when the DAX is finished. Detailed information on polled to determine when the DAX is finished. Detailed information on
the contents of the completion area can be found in section 36.2.2 of the contents of the completion area can be found in section 36.2.2 of
the DAX HV API document. the DAX HV API document::
while (1) { while (1) {
/* Monitored Load */ /* Monitored Load */
...@@ -355,7 +362,7 @@ the DAX HV API document. ...@@ -355,7 +362,7 @@ the DAX HV API document.
A completion area status of 1 indicates successful completion of the A completion area status of 1 indicates successful completion of the
CCB and validity of the output bitmap, which may be used immediately. CCB and validity of the output bitmap, which may be used immediately.
All other non-zero values indicate error conditions which are All other non-zero values indicate error conditions which are
described in section 36.2.2. described in section 36.2.2::
if (completion_area[0] != 1) { /* section 36.2.2, 1 = command ran and succeeded */ if (completion_area[0] != 1) { /* section 36.2.2, 1 = command ran and succeeded */
/* completion_area[0] contains the completion status */ /* completion_area[0] contains the completion status */
...@@ -364,7 +371,7 @@ described in section 36.2.2. ...@@ -364,7 +371,7 @@ described in section 36.2.2.
After the completion area has been processed, the driver must be After the completion area has been processed, the driver must be
notified that it can release any resources associated with the notified that it can release any resources associated with the
request. This is done via the dequeue operation: request. This is done via the dequeue operation::
struct dax_command cmd; struct dax_command cmd;
cmd.command = CCB_DEQUEUE; cmd.command = CCB_DEQUEUE;
...@@ -375,13 +382,14 @@ request. This is done via the dequeue operation: ...@@ -375,13 +382,14 @@ request. This is done via the dequeue operation:
Finally, normal program cleanup should be done, i.e., unmapping Finally, normal program cleanup should be done, i.e., unmapping
completion area, closing the dax device, freeing memory etc. completion area, closing the dax device, freeing memory etc.
[Kernel example] Kernel example
--------------
The only difference in using the DAX in kernel code is the treatment The only difference in using the DAX in kernel code is the treatment
of the completion area. Unlike user applications which mmap the of the completion area. Unlike user applications which mmap the
completion area allocated by the driver, kernel code must allocate its completion area allocated by the driver, kernel code must allocate its
own memory to use for the completion area, and this address and its own memory to use for the completion area, and this address and its
type must be given in the CCB: type must be given in the CCB::
ccb->control |= /* Table 36.1, CCB Header Format */ ccb->control |= /* Table 36.1, CCB Header Format */
(3L << 32); /* completion area address type = primary virtual */ (3L << 32); /* completion area address type = primary virtual */
...@@ -389,9 +397,11 @@ type must be given in the CCB: ...@@ -389,9 +397,11 @@ type must be given in the CCB:
ccb->completion = (unsigned long) completion_area; /* Completion area address */ ccb->completion = (unsigned long) completion_area; /* Completion area address */
The dax submit hypercall is made directly. The flags used in the The dax submit hypercall is made directly. The flags used in the
ccb_submit call are documented in the DAX HV API in section 36.3.1. ccb_submit call are documented in the DAX HV API in section 36.3.1/
#include <asm/hypervisor.h> ::
#include <asm/hypervisor.h>
hv_rv = sun4v_ccb_submit((unsigned long)ccb, 64, hv_rv = sun4v_ccb_submit((unsigned long)ccb, 64,
HV_CCB_QUERY_CMD | HV_CCB_QUERY_CMD |
...@@ -405,7 +415,7 @@ ccb_submit call are documented in the DAX HV API in section 36.3.1. ...@@ -405,7 +415,7 @@ ccb_submit call are documented in the DAX HV API in section 36.3.1.
} }
After the submission, the completion area polling code is identical to After the submission, the completion area polling code is identical to
that in user land: that in user land::
while (1) { while (1) {
/* Monitored Load */ /* Monitored Load */
...@@ -427,3 +437,9 @@ that in user land: ...@@ -427,3 +437,9 @@ that in user land:
The output bitmap is ready for consumption immediately after the The output bitmap is ready for consumption immediately after the
completion status indicates success. completion status indicates success.
Excer[t from UltraSPARC Virtual Machine Specification
=====================================================
.. include:: dax-hv-api.txt
:literal:
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
* the recommended way for applications to use the coprocessor, and * the recommended way for applications to use the coprocessor, and
* the driver interface is not intended for general use. * the driver interface is not intended for general use.
* *
* See Documentation/sparc/oradax/oracle-dax.txt for more details. * See Documentation/sparc/oradax/oracle-dax.rst for more details.
*/ */
#include <linux/uaccess.h> #include <linux/uaccess.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment