www.pudn.com > efs.rar > fs_device.c
/***********************************************************************
* fs_device.c
*
* Flash operation wrappers and counters.
* Copyright (C) 2006 QUALCOMM, Inc.
*
***********************************************************************/
/*===========================================================================
EDIT HISTORY FOR MODULE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
$Header: //depot/asic/MSMSHARED/services/efs/MSM_EFS.01.02/fs_device.c#6 $ $DateTime: 2006/11/13 09:22:31 $ $Author: davidb $
when who what, where, why
---------- --- ---------------------------------------------------------
2006-11-09 dlb Add dealloc counter.
2006-09-22 sh More comments.
2006-09-22 dlb Lint fixes.
2006-09-12 dlb Change some queries to unsigned values.
2006-09-01 dlb Create
===========================================================================*/
#include "fs_device.h"
#include "assert.h"
#ifndef FEATURE_FS_BENCHMARK
/* When FEATURE_FS_BENCHMARK is enabled, these counters are provided
as part of the global fs_counter structure. When the is no
benchmarking code, we provide our own local counters to hold these
same values. */
uint32 fs_flash_write_page_counter = 0;
uint32 fs_flash_read_page_counter = 0;
uint32 fs_flash_erase_block_counter = 0;
#endif
uint32 fs_flash_pcache_miss_counter = 0;
uint32 fs_flash_pcache_hit_counter = 0;
uint32 fs_flash_buffer_miss_counter = 0;
uint32 fs_flash_buffer_hit_counter = 0;
uint32 fs_flash_dealloc_counter = 0;
/* These variables maintain a count of flash device operations for
* performance analysis. The values can be inspected by JTAG or by
* the optional code below. */
static uint32 read_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 };
static uint32 write_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 };
static uint32 erase_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 };
static uint32 buffer_fill_counters[NUM_FS_BUFOP_CATEGORIES] = { 0 };
/* The counters should always be updated, but there might not be any
* code to reference (read) them. They are still useful from within a
* debugger. We explain it to Lint this way: */
//lint -esym(551, write_color_counters)
//lint -esym(551, read_color_counters)
//lint -esym(551, erase_color_counters)
//lint -esym(551, buffer_fill_counters)
int
fs_flash_write_page (fs_device_t dev, page_id page, void *data,
enum fs_flashop_category category)
{
ASSERT (category < NUM_FS_FLASHOP_CATEGORIES);
fs_flash_write_page_counter++;
write_color_counters[category]++;
return dev->write_page (dev, page, data);
}
int
fs_flash_erase_block (fs_device_t dev, block_id block,
enum fs_flashop_category category)
{
ASSERT (category < NUM_FS_FLASHOP_CATEGORIES);
fs_flash_erase_block_counter++;
erase_color_counters[category]++;
return dev->erase_block (dev, block);
}
int
fs_flash_read_page (fs_device_t dev, page_id page, void *data,
enum fs_flashop_category category)
{
ASSERT (category < NUM_FS_FLASHOP_CATEGORIES);
fs_flash_read_page_counter++;
read_color_counters[category]++;
return dev->read_page (dev, page, data);
}
void
fs_flash_buffer_fill (enum fs_bufop_category category)
{
ASSERT (category < NUM_FS_BUFOP_CATEGORIES);
buffer_fill_counters[category]++;
}
uint32
fs_flash_block_size (fs_device_t dev)
{
return dev->block_size (dev);
}
uint32
fs_flash_page_size (fs_device_t dev)
{
return dev->page_size (dev);
}
uint32
fs_flash_block_count (fs_device_t dev)
{
return dev->block_count (dev);
}
int
fs_flash_bad_block_check (fs_device_t dev, block_id block)
{
return dev->bad_block_check (dev, block);
}
int
fs_flash_is_erased (fs_device_t dev, page_id page)
{
return dev->is_erased (dev, page);
}
int
fs_flash_mark_block_bad (fs_device_t dev, block_id block)
{
return dev->mark_block_bad (dev, block);
}
int
fs_flash_resume_erase (fs_device_t dev)
{
return dev->resume_erase (dev);
}
int
fs_flash_erase_status (fs_device_t dev)
{
return dev->erase_status (dev);
}
int
fs_flash_suspend_erase (fs_device_t dev)
{
return dev->suspend_erase (dev);
}
int
fs_flash_begin_erase_block (fs_device_t dev, block_id block)
{
return dev->begin_erase_block (dev, block);
}
int
fs_flash_partial_write (fs_device_t dev, page_id page,
void *data, int offset, int length)
{
return dev->partial_write (dev, page, data, offset, length);
}
void *
fs_flash_read_pointer (fs_device_t dev, page_id page)
{
return dev->read_pointer (dev, page);
}
#ifdef FS_UNIT_TEST
#error code not present
#endif /* FS_UNIT_TEST */