brillcodec: re-arrange device command 72/27472/2
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Sat, 13 Sep 2014 04:36:22 +0000 (13:36 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Mon, 15 Sep 2014 04:56:29 +0000 (21:56 -0700)
Change-Id: I6175149ea1bddbfd0f4156121fc39e01e81d70d2
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
tizen/src/hw/pci/maru_brillcodec.c
tizen/src/hw/pci/maru_brillcodec_device.c
tizen/src/hw/pci/maru_brillcodec_plugin.h

index f768878a84b5ad8af6c1655470bcae11adf38d71..d4e4579237395a003c40b94ed1e12f14cfefbf7b 100644 (file)
@@ -198,6 +198,8 @@ static void brillcodec_push_readqueue(MaruBrillCodecState *s,
         data_buf = brillcodec_store_inbuf((uint8_t *)s->vaddr, ioparam);
         break;
     case CODEC_PICTURE_COPY:
+    case CODEC_DEINIT:
+    case CODEC_FLUSH_BUFFERS:
     default:
         TRACE("no buffer from guest\n");
         break;
index 21ee8811c7ef4af27b3f928d6bd8b690b8b1be17..428525f5133bd839a9f44a5152970587fe2c915b 100644 (file)
@@ -57,17 +57,17 @@ MULTI_DEBUG_CHANNEL(qemu, brillcodec);
 extern CodecPlugin dxva_plugin;
 #endif
 
-enum codec_io_cmd {
-    CODEC_CMD_API_INDEX             = 0x28,
-    CODEC_CMD_CONTEXT_INDEX         = 0x2C,
-    CODEC_CMD_DEVICE_MEM_OFFSET     = 0x34,
-    CODEC_CMD_GET_THREAD_STATE      = 0x38,
-    CODEC_CMD_GET_CTX_FROM_QUEUE    = 0x3C,
-    CODEC_CMD_GET_DATA_FROM_QUEUE   = 0x40,
-    CODEC_CMD_RELEASE_CONTEXT       = 0x44,
-    CODEC_CMD_GET_VERSION           = 0x50,
-    CODEC_CMD_GET_ELEMENT           = 0x54,
-    CODEC_CMD_GET_CONTEXT_INDEX     = 0x58,
+enum device_cmd {
+    DEVICE_CMD_API_INDEX             = 0,
+    DEVICE_CMD_CONTEXT_INDEX,
+    DEVICE_CMD_DEVICE_MEM_OFFSET,
+    DEVICE_CMD_GET_THREAD_STATE,
+    DEVICE_CMD_GET_CTX_FROM_QUEUE,
+    DEVICE_CMD_GET_DATA_FROM_QUEUE,
+    DEVICE_CMD_RELEASE_CONTEXT,
+    DEVICE_CMD_GET_ELEMENT,
+    DEVICE_CMD_GET_CONTEXT_INDEX,
+    DEVICE_CMD_GET_DEVICE_INFO,
 };
 
 enum thread_state {
@@ -145,8 +145,8 @@ static uint64_t brillcodec_read(void *opaque,
     MaruBrillCodecState *s = (MaruBrillCodecState *)opaque;
     uint64_t ret = 0;
 
-    switch (addr) {
-    case CODEC_CMD_GET_THREAD_STATE:
+    switch (addr >> 2) {
+    case DEVICE_CMD_GET_THREAD_STATE:
         qemu_mutex_lock(&s->context_queue_mutex);
         if (s->irq_raised) {
             ret = CODEC_TASK_END;
@@ -158,7 +158,7 @@ static uint64_t brillcodec_read(void *opaque,
         TRACE("get thread_state. ret: %d\n", ret);
         break;
 
-    case CODEC_CMD_GET_CTX_FROM_QUEUE:
+    case DEVICE_CMD_GET_CTX_FROM_QUEUE:
     {
         DeviceMemEntry *head = NULL;
 
@@ -178,16 +178,17 @@ static uint64_t brillcodec_read(void *opaque,
     }
         break;
 
-    case CODEC_CMD_GET_VERSION:
+    case DEVICE_CMD_GET_DEVICE_INFO:
+        // we have only version information for now...
         ret = CODEC_VERSION;
         TRACE("codec version: %d\n", ret);
         break;
 
-    case CODEC_CMD_GET_ELEMENT:
+    case DEVICE_CMD_GET_ELEMENT:
         ret = brillcodec_query_list(s);
         break;
 
-    case CODEC_CMD_GET_CONTEXT_INDEX:
+    case DEVICE_CMD_GET_CONTEXT_INDEX:
         ret = brillcodec_get_context_index(s);
         TRACE("get context index: %d\n", ret);
         break;
@@ -204,24 +205,24 @@ static void brillcodec_write(void *opaque, hwaddr addr,
 {
     MaruBrillCodecState *s = (MaruBrillCodecState *)opaque;
 
-    switch (addr) {
-    case CODEC_CMD_API_INDEX:
+    switch (addr >> 2) {
+    case DEVICE_CMD_API_INDEX:
         TRACE("set codec_cmd value: %d\n", value);
         s->ioparam.api_index = value;
         brillcodec_wakeup_threads(s, value);
         break;
 
-    case CODEC_CMD_CONTEXT_INDEX:
+    case DEVICE_CMD_CONTEXT_INDEX:
         TRACE("set context_index value: %d\n", value);
         s->ioparam.ctx_index = value;
         break;
 
-    case CODEC_CMD_DEVICE_MEM_OFFSET:
+    case DEVICE_CMD_DEVICE_MEM_OFFSET:
         TRACE("set mem_offset value: 0x%x\n", value);
         s->ioparam.mem_offset = value;
         break;
 
-    case CODEC_CMD_RELEASE_CONTEXT:
+    case DEVICE_CMD_RELEASE_CONTEXT:
     {
         int ctx_id = (int32_t)value;
 
@@ -234,7 +235,7 @@ static void brillcodec_write(void *opaque, hwaddr addr,
     }
         break;
 
-    case CODEC_CMD_GET_DATA_FROM_QUEUE:
+    case DEVICE_CMD_GET_DATA_FROM_QUEUE:
         brillcodec_pop_writequeue(s, (uint32_t)value);
         break;
 
@@ -254,32 +255,38 @@ static const MemoryRegionOps brillcodec_mmio_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-#ifdef CONFIG_VAAPI
-static CodecPlugin *vaapi_probe(void) {
-    // FIXME: probing...
-    void *handle;
-
-    handle = dlopen("brillcodec-vaapi.so", RTLD_NOW);
-    if (!handle) {
-        INFO("plugin load failed : %s\n", dlerror());
-        return NULL;
-    }
+#define NUM_PLUGINS     2
+static CodecPlugin *probe_plugin(void) {
+    CodecPlugin *plugins[NUM_PLUGINS] = { NULL, };
+    int i = 0;
 
-    CodecPlugin *plugin = dlsym(handle, "vaapi_plugin");
+#if defined(CONFIG_VAAPI)
+    {
+        void *handle;
 
-    return plugin;
-}
-#endif
-#ifdef CONFIG_DXVA2
-static CodecPlugin *dxva2_probe(void) {
-    CodecPlugin *plugin = NULL;
+        handle = dlopen("brillcodec-vaapi.so", RTLD_NOW);
+        if (!handle) {
+            INFO("plugin load failed : %s\n", dlerror());
+            return NULL;
+        }
 
-    plugin = &dxva_plugin;
+        plugins[i++] = dlsym(handle, "vaapi_plugin");
 
-    return plugin;
-}
+    }
+#elif defined(CONFIG_DXVA2)
+    {
+        plugins[i++] = &dxva_plugin;
+    }
 #endif
 
+    for (i = 0; i < NUM_PLUGINS; ++i) {
+        if (plugins[i] && plugins[i]->probe && plugins[i]->probe()) {
+            return plugins[i];
+        }
+    }
+
+    return NULL;
+}
 
 static int brillcodec_initfn(PCIDevice *dev)
 {
@@ -309,16 +316,9 @@ static int brillcodec_initfn(PCIDevice *dev)
     s->codec_bh = qemu_bh_new(brillcodec_bh_callback, s);
 
     // register plugins
-#ifdef CONFIG_VAAPI
-    if ((s->hwaccel_plugin = vaapi_probe())) {
+    if ((s->hwaccel_plugin = probe_plugin())) {
         INFO("VA-API extension is enabled.\n");
     }
-#endif
-#ifdef CONFIG_DXVA2
-    if ((s->hwaccel_plugin = dxva2_probe())) {
-        INFO("DXVA2 extension is enabled.\n");
-    }
-#endif
 
     return 0;
 }
index 5b49b24e61955d1206798699e21a35b27299628b..70e15c247d4549e7f11bbefa691b185fa56ac5e5 100644 (file)
@@ -38,6 +38,7 @@
 typedef struct CodecPlugin {
     enum PixelFormat    pix_fmt;
     enum PixelFormat    output_pix_fmt;
+    bool                (*probe)(void);
     bool                (*setup)(AVCodecContext *, int , int);
     int                 (*get_buffer)(struct AVCodecContext *, AVFrame *);
     void                (*release_buffer)(struct AVCodecContext *, AVFrame *);