Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 162386
b: refs/heads/master
c: 51faa9d
h: refs/heads/master
v: v3
  • Loading branch information
Alan Cox authored and Greg Kroah-Hartman committed Sep 15, 2009
1 parent a91ef50 commit cb2e697
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 62 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c7b7556245f3d0e825bf5c73dd9380b6b26737c5
refs/heads/master: 51faa9d27cbcfd5165d31762161319a2fdb11856
110 changes: 51 additions & 59 deletions trunk/drivers/staging/sep/sep_driver.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
*
* sep_main_mod.c - Security Processor Driver main group of functions
* sep_driver.c - Security Processor Driver main group of functions
*
* Copyright(c) 2009 Intel Corporation. All rights reserved.
* Copyright(c) 2009 Discretix. All rights reserved.
Expand Down Expand Up @@ -144,7 +144,6 @@ static void sep_load_rom_code(struct sep_device *sep) { }
DEFINES
-----------------------------------------*/

#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
#define BASE_ADDRESS_FOR_SYSTEM 0xfffc0000
#define SEP_RAR_IO_MEM_REGION_SIZE 0x40000

Expand All @@ -153,9 +152,9 @@ static void sep_load_rom_code(struct sep_device *sep) { }
--------------------------------------------*/

/* debug messages level */
static int sepDebug;
module_param(sepDebug, int , 0);
MODULE_PARM_DESC(sepDebug, "Flag to enable SEP debug messages");
static int debug;
module_param(debug, int , 0);
MODULE_PARM_DESC(debug, "Flag to enable SEP debug messages");

/* Keep this a single static object for now to keep the conversion easy */

Expand All @@ -174,7 +173,7 @@ static DECLARE_WAIT_QUEUE_HEAD(sep_event);
/*
This functions copies the cache and resident from their source location into
destination memory, which is external to Linux VM and is given as
physical address
bus address
*/
static int sep_copy_cache_resident_to_area(struct sep_device *sep,
unsigned long src_cache_addr,
Expand All @@ -200,7 +199,7 @@ static int sep_copy_cache_resident_to_area(struct sep_device *sep,
error = 0;

edbg("SEP Driver:rar_virtual is %p\n", sep->rar_addr);
edbg("SEP Driver:rar_physical is %08llx\n", (unsigned long long)sep->rar_bus);
edbg("SEP Driver:rar_bus is %08llx\n", (unsigned long long)sep->rar_bus);

sep->rar_region_addr = (unsigned long) sep->rar_addr;

Expand Down Expand Up @@ -246,18 +245,18 @@ static int sep_copy_cache_resident_to_area(struct sep_device *sep,

resident_addr = sep->resident_addr;

edbg("SEP Driver:resident_addr (physical )is %08llx\n", (unsigned long long)sep->resident_bus);
edbg("SEP Driver:cache_addr (physical) is %08llx\n", (unsigned long long)sep->cache_bus);
edbg("SEP Driver:resident_addr (bus)is %08llx\n", (unsigned long long)sep->resident_bus);
edbg("SEP Driver:cache_addr (bus) is %08llx\n", (unsigned long long)sep->cache_bus);

edbg("SEP Driver:resident_addr (logical )is %p\n", resident_addr);
edbg("SEP Driver:cache_addr (logical) is %08llx\n", (unsigned long long)cache_addr);
edbg("SEP Driver:resident_addr (virtual)is %p\n", resident_addr);
edbg("SEP Driver:cache_addr (virtual) is %08llx\n", (unsigned long long)cache_addr);

edbg("SEP Driver:resident_size is %08lx\n", sep->resident_size);
edbg("SEP Driver:cache_size is %08llx\n", (unsigned long long)sep->cache_size);



/* physical addresses */
/* bus addresses */
*dst_new_cache_addr_ptr = sep->cache_bus;
*dst_new_resident_addr_ptr = sep->resident_bus;
end_function:
Expand Down Expand Up @@ -285,9 +284,9 @@ static int sep_map_and_alloc_shared_area(struct sep_device *sep,
return -ENOMEM;
}
sep->shared_area = sep->shared_addr;
/* set the physical address of the shared area */
/* set the bus address of the shared area */
sep->shared_area_bus = sep->shared_bus;
edbg("sep: shared_area %d bytes @%p (bus %08llx)\n",
edbg("sep: shared_area %ld bytes @%p (bus %08llx)\n",
size, sep->shared_addr, (unsigned long long)sep->shared_bus);
return 0;
}
Expand All @@ -309,15 +308,15 @@ static void sep_unmap_and_free_shared_area(struct sep_device *sep, int size)
/**
* sep_shared_area_virt_to_bus - convert bus/virt addresses
*
* Returns the physical address inside the shared area according
* Returns the bus address inside the shared area according
* to the virtual address.
*/

static dma_addr_t sep_shared_area_virt_to_bus(struct sep_device *sep,
void *virt_address)
{
dma_addr_t pa = sep->shared_bus + (virt_address - sep->shared_addr);
edbg("sep: virt to phys p %08llx v %p\n", pa, virt_address);
edbg("sep: virt to bus b %08llx v %p\n", pa, virt_address);
return pa;
}

Expand Down Expand Up @@ -403,7 +402,7 @@ static int sep_release(struct inode *inode_ptr, struct file *filp)
-----------------------------------------------------------------*/
static int sep_mmap(struct file *filp, struct vm_area_struct *vma)
{
dma_addr_t phys_addr;
dma_addr_t bus_addr;
struct sep_device *sep = filp->private_data;

dbg("-------->SEP Driver: mmap start\n");
Expand All @@ -421,12 +420,12 @@ static int sep_mmap(struct file *filp, struct vm_area_struct *vma)

edbg("SEP Driver:sep->message_shared_area_addr is %p\n", sep->message_shared_area_addr);

/* get physical address */
phys_addr = sep->shared_area_bus;
/* get bus address */
bus_addr = sep->shared_area_bus;

edbg("SEP Driver: phys_addr is %08llx\n", (unsigned long long)phys_addr);
edbg("SEP Driver: phys_addr is %08llx\n", (unsigned long long)bus_addr);

if (remap_pfn_range(vma, vma->vm_start, phys_addr >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot)) {
if (remap_pfn_range(vma, vma->vm_start, bus_addr >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot)) {
edbg("SEP Driver remap_page_range failed\n");
printk(KERN_WARNING "SEP Driver remap_page_range failed\n");
return -EAGAIN;
Expand All @@ -445,16 +444,16 @@ static unsigned int sep_poll(struct file *filp, poll_table * wait)
{
unsigned long count;
unsigned int mask = 0;
unsigned long retVal = 0; /* flow id */
unsigned long retval = 0; /* flow id */
struct sep_device *sep = filp->private_data;

dbg("---------->SEP Driver poll: start\n");


#if SEP_DRIVER_POLLING_MODE

while (sep->send_ct != (retVal & 0x7FFFFFFF)) {
retVal = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR2_REG_ADDR);
while (sep->send_ct != (retval & 0x7FFFFFFF)) {
retval = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR2_REG_ADDR);

for (count = 0; count < 10 * 4; count += 4)
edbg("Poll Debug Word %lu of the message is %lu\n", count, *((unsigned long *) (sep->shared_area + SEP_DRIVER_MESSAGE_SHARED_AREA_SIZE_IN_BYTES + count)));
Expand All @@ -478,10 +477,10 @@ static unsigned int sep_poll(struct file *filp, poll_table * wait)
for (count = 0; count < 10 * 4; count += 4)
edbg("Debug Data Word %lu of the message is %lu\n", count, *((unsigned long *) (sep->shared_area + 0x1800 + count)));

retVal = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR2_REG_ADDR);
edbg("retVal is %lu\n", retVal);
retval = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR2_REG_ADDR);
edbg("retval is %lu\n", retval);
/* check if the this is sep reply or request */
if (retVal >> 31) {
if (retval >> 31) {
edbg("SEP Driver: sep request in\n");
/* request */
mask |= POLLOUT | POLLWRNORM;
Expand Down Expand Up @@ -581,7 +580,7 @@ static void sep_send_reply_command_handler(struct sep_device *sep)

/*
This function handles the allocate data pool memory request
This function returns calculates the physical address of the
This function returns calculates the bus address of the
allocated memory, and the offset of this area from the mapped address.
Therefore, the FVOs in user space can calculate the exact virtual
address of this allocated memory
Expand All @@ -600,12 +599,11 @@ static int sep_allocate_data_pool_memory_handler(struct sep_device *sep,

/* allocate memory */
if ((sep->data_pool_bytes_allocated + command_args.num_bytes) > SEP_DRIVER_DATA_POOL_SHARED_AREA_SIZE_IN_BYTES) {
/* FIXME: ENOMEM ? */
error = -ENOTTY;
error = -ENOMEM;
goto end_function;
}

/* set the virtual and physical address */
/* set the virtual and bus address */
command_args.offset = SEP_DRIVER_DATA_POOL_AREA_OFFSET_IN_BYTES + sep->data_pool_bytes_allocated;
command_args.phys_address = sep->shared_area_bus + SEP_DRIVER_DATA_POOL_AREA_OFFSET_IN_BYTES + sep->data_pool_bytes_allocated;

Expand Down Expand Up @@ -658,8 +656,7 @@ static int sep_write_into_data_pool_handler(struct sep_device *sep, unsigned lon

/* check that the range of the virtual kernel address is correct */
if (virt_address < data_pool_area_addr || virt_address > (data_pool_area_addr + SEP_DRIVER_DATA_POOL_SHARED_AREA_SIZE_IN_BYTES)) {
/* FIXME: EINVAL ? */
error = -ENOTTY;
error = -EINVAL;
goto end_function;
}
/* copy the application data */
Expand Down Expand Up @@ -708,7 +705,7 @@ static int sep_read_from_data_pool_handler(struct sep_device *sep, unsigned long
and when doing that also overflows */
/* check that the range of the virtual kernel address is correct */
if (virt_address < data_pool_area_addr || virt_address > data_pool_area_addr + SEP_DRIVER_DATA_POOL_SHARED_AREA_SIZE_IN_BYTES) {
error = -ENOTTY;
error = -EINVAL;
goto end_function;
}

Expand Down Expand Up @@ -1477,8 +1474,8 @@ static int sep_create_sync_dma_tables_handler(struct sep_device *sep,
if (error)
goto end_function;
/* copy to user */
error = copy_to_user((void *) arg, (void *) &command_args, sizeof(struct sep_driver_build_sync_table_t));
/* FIXME: wrong error returned ! */
if (copy_to_user((void *) arg, (void *) &command_args, sizeof(struct sep_driver_build_sync_table_t)))
error = -EFAULT;
end_function:
dbg("SEP Driver:<-------- sep_create_sync_dma_tables_handler end\n");
return error;
Expand Down Expand Up @@ -1978,7 +1975,7 @@ static int sep_add_flow_tables_message_handler(struct sep_device *sep, unsigned


/*
this function returns the physical and virtual addresses of the static pool
this function returns the bus and virtual addresses of the static pool
*/
static int sep_get_static_pool_addr_handler(struct sep_device *sep, unsigned long arg)
{
Expand All @@ -1991,7 +1988,7 @@ static int sep_get_static_pool_addr_handler(struct sep_device *sep, unsigned lon
command_args.physical_static_address = sep->shared_area_bus + SEP_DRIVER_STATIC_AREA_OFFSET_IN_BYTES;
command_args.virtual_static_address = (unsigned long)sep->shared_area + SEP_DRIVER_STATIC_AREA_OFFSET_IN_BYTES;

edbg("SEP Driver:physical_static_address is %08lx, virtual_static_address %08lx\n", command_args.physical_static_address, command_args.virtual_static_address);
edbg("SEP Driver:bus_static_address is %08lx, virtual_static_address %08lx\n", command_args.physical_static_address, command_args.virtual_static_address);

/* send the parameters to user application */
error = copy_to_user((void *) arg, &command_args, sizeof(struct sep_driver_static_pool_addr_t));
Expand All @@ -2015,15 +2012,14 @@ static int sep_get_physical_mapped_offset_handler(struct sep_device *sep, unsign
goto end_function;

if (command_args.physical_address < sep->shared_area_bus) {
/* FIXME */
error = -ENOTTY;
error = -EINVAL;
goto end_function;
}

/*prepare the output parameters in the struct */
command_args.offset = command_args.physical_address - sep->shared_area_bus;

edbg("SEP Driver:physical_address is %08lx, offset is %lu\n", command_args.physical_address, command_args.offset);
edbg("SEP Driver:bus_address is %08lx, offset is %lu\n", command_args.physical_address, command_args.offset);

/* send the parameters to user application */
error = copy_to_user((void *) arg, &command_args, sizeof(struct sep_driver_get_mapped_offset_t));
Expand Down Expand Up @@ -2130,8 +2126,8 @@ static int sep_realloc_cache_resident_handler(struct sep_device *sep,
unsigned long arg)
{
int error;
unsigned long phys_cache_address;
unsigned long phys_resident_address;
unsigned long bus_cache_address;
unsigned long bus_resident_address;
struct sep_driver_realloc_cache_resident_t command_args;

/* copy the data */
Expand All @@ -2140,22 +2136,22 @@ static int sep_realloc_cache_resident_handler(struct sep_device *sep,
goto end_function;

/* copy cache and resident to the their intended locations */
error = sep_copy_cache_resident_to_area(sep, command_args.cache_addr, command_args.cache_size_in_bytes, command_args.resident_addr, command_args.resident_size_in_bytes, &phys_cache_address, &phys_resident_address);
error = sep_copy_cache_resident_to_area(sep, command_args.cache_addr, command_args.cache_size_in_bytes, command_args.resident_addr, command_args.resident_size_in_bytes, &bus_cache_address, &bus_resident_address);
if (error)
goto end_function;

command_args.new_base_addr = sep->shared_area_bus;

/* find the new base address according to the lowest address between
cache, resident and shared area */
if (phys_resident_address < command_args.new_base_addr)
command_args.new_base_addr = phys_resident_address;
if (phys_cache_address < command_args.new_base_addr)
command_args.new_base_addr = phys_cache_address;
if (bus_resident_address < command_args.new_base_addr)
command_args.new_base_addr = bus_resident_address;
if (bus_cache_address < command_args.new_base_addr)
command_args.new_base_addr = bus_cache_address;

/* set the return parameters */
command_args.new_cache_addr = phys_cache_address;
command_args.new_resident_addr = phys_resident_address;
command_args.new_cache_addr = bus_cache_address;
command_args.new_resident_addr = bus_resident_address;

/* set the new shared area */
command_args.new_shared_area_addr = sep->shared_area_bus;
Expand Down Expand Up @@ -2253,10 +2249,6 @@ static int sep_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, u

edbg("SEP Driver: cmd is %x\n", cmd);

/* check that the command is for sep device */
if (_IOC_TYPE(cmd) != SEP_IOC_MAGIC_NUMBER)
error = -ENOTTY;

switch (cmd) {
case SEP_IOCSENDSEPCOMMAND:
/* send command to SEP */
Expand Down Expand Up @@ -2521,12 +2513,12 @@ static int __devinit sep_probe(struct pci_dev *pdev, const struct pci_device_id
sep_write_reg(sep, HW_HOST_HOST_SEP_GPR1_REG_ADDR, sep->shared_area_bus);

/* poll for SEP response */
retVal = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR1_REG_ADDR);
while (retVal != 0xffffffff && retVal != sep->shared_area_bus)
retVal = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR1_REG_ADDR);
retval = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR1_REG_ADDR);
while (retval != 0xffffffff && retval != sep->shared_area_bus)
retval = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR1_REG_ADDR);

/* check the return value (register) */
if (retVal != sep->shared_area_bus) {
if (retval != sep->shared_area_bus) {
error = -ENOMEM;
goto end_function_deallocate_sep_shared_area;
}
Expand Down Expand Up @@ -2590,7 +2582,7 @@ static int __devinit sep_probe(struct pci_dev *pdev, const struct pci_device_id
/* FIXME */
sep->rar_bus = __pa(sep->rar_addr);

edbg("SEP Driver:rar_physical is %08llx\n", (unsigned long long)sep->rar_bus);
edbg("SEP Driver:rar_bus is %08llx\n", (unsigned long long)sep->rar_bus);
edbg("SEP Driver:rar_virtual is %p\n", sep->rar_addr);

#if !SEP_DRIVER_POLLING_MODE
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/staging/sep/sep_driver_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,13 +210,13 @@

#define dbg(fmt, args...) \
do {\
if (sepDebug & SEP_DEBUG_LEVEL_BASIC) \
if (debug & SEP_DEBUG_LEVEL_BASIC) \
printk(KERN_DEBUG fmt, ##args); \
} while(0);

#define edbg(fmt, args...) \
do { \
if (sepDebug & SEP_DEBUG_LEVEL_EXTENDED) \
if (debug & SEP_DEBUG_LEVEL_EXTENDED) \
printk(KERN_DEBUG fmt, ##args); \
} while(0);

Expand Down

0 comments on commit cb2e697

Please sign in to comment.