1751a7a5dSPaolo Bonzini /* 2751a7a5dSPaolo Bonzini * libqos driver framework 3751a7a5dSPaolo Bonzini * 4751a7a5dSPaolo Bonzini * Copyright (c) 2019 Red Hat, Inc. 5751a7a5dSPaolo Bonzini * 6751a7a5dSPaolo Bonzini * Author: Paolo Bonzini <pbonzini@redhat.com> 7751a7a5dSPaolo Bonzini * 8751a7a5dSPaolo Bonzini * This library is free software; you can redistribute it and/or 9751a7a5dSPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 10dc0ad02dSThomas Huth * License version 2.1 as published by the Free Software Foundation. 11751a7a5dSPaolo Bonzini * 12751a7a5dSPaolo Bonzini * This library is distributed in the hope that it will be useful, 13751a7a5dSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 14751a7a5dSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15751a7a5dSPaolo Bonzini * Lesser General Public License for more details. 16751a7a5dSPaolo Bonzini * 17751a7a5dSPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 18751a7a5dSPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/> 19751a7a5dSPaolo Bonzini */ 20751a7a5dSPaolo Bonzini 21751a7a5dSPaolo Bonzini #include "qemu/osdep.h" 22751a7a5dSPaolo Bonzini #include "libqtest.h" 23*a2ce7dbdSPaolo Bonzini #include "malloc.h" 24*a2ce7dbdSPaolo Bonzini #include "qgraph.h" 25*a2ce7dbdSPaolo Bonzini #include "i2c.h" 26751a7a5dSPaolo Bonzini 27751a7a5dSPaolo Bonzini #define ARM_PAGE_SIZE 4096 28751a7a5dSPaolo Bonzini #define IMX25_PDK_RAM_START 0x80000000 29751a7a5dSPaolo Bonzini #define IMX25_PDK_RAM_END 0x88000000 30751a7a5dSPaolo Bonzini 31751a7a5dSPaolo Bonzini typedef struct QIMX25PDKMachine QIMX25PDKMachine; 32751a7a5dSPaolo Bonzini 33751a7a5dSPaolo Bonzini struct QIMX25PDKMachine { 34751a7a5dSPaolo Bonzini QOSGraphObject obj; 35751a7a5dSPaolo Bonzini QGuestAllocator alloc; 36751a7a5dSPaolo Bonzini IMXI2C i2c_1; 37751a7a5dSPaolo Bonzini }; 38751a7a5dSPaolo Bonzini 39751a7a5dSPaolo Bonzini static void *imx25_pdk_get_driver(void *object, const char *interface) 40751a7a5dSPaolo Bonzini { 41751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = object; 42751a7a5dSPaolo Bonzini if (!g_strcmp0(interface, "memory")) { 43751a7a5dSPaolo Bonzini return &machine->alloc; 44751a7a5dSPaolo Bonzini } 45751a7a5dSPaolo Bonzini 46751a7a5dSPaolo Bonzini fprintf(stderr, "%s not present in arm/imx25_pdk\n", interface); 47751a7a5dSPaolo Bonzini g_assert_not_reached(); 48751a7a5dSPaolo Bonzini } 49751a7a5dSPaolo Bonzini 50751a7a5dSPaolo Bonzini static QOSGraphObject *imx25_pdk_get_device(void *obj, const char *device) 51751a7a5dSPaolo Bonzini { 52751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = obj; 53751a7a5dSPaolo Bonzini if (!g_strcmp0(device, "imx.i2c")) { 54751a7a5dSPaolo Bonzini return &machine->i2c_1.obj; 55751a7a5dSPaolo Bonzini } 56751a7a5dSPaolo Bonzini 57751a7a5dSPaolo Bonzini fprintf(stderr, "%s not present in arm/imx25_pdk\n", device); 58751a7a5dSPaolo Bonzini g_assert_not_reached(); 59751a7a5dSPaolo Bonzini } 60751a7a5dSPaolo Bonzini 61751a7a5dSPaolo Bonzini static void imx25_pdk_destructor(QOSGraphObject *obj) 62751a7a5dSPaolo Bonzini { 63751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = (QIMX25PDKMachine *) obj; 64751a7a5dSPaolo Bonzini alloc_destroy(&machine->alloc); 65751a7a5dSPaolo Bonzini } 66751a7a5dSPaolo Bonzini 67751a7a5dSPaolo Bonzini static void *qos_create_machine_arm_imx25_pdk(QTestState *qts) 68751a7a5dSPaolo Bonzini { 69751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = g_new0(QIMX25PDKMachine, 1); 70751a7a5dSPaolo Bonzini 71751a7a5dSPaolo Bonzini alloc_init(&machine->alloc, 0, 72751a7a5dSPaolo Bonzini IMX25_PDK_RAM_START, 73751a7a5dSPaolo Bonzini IMX25_PDK_RAM_END, 74751a7a5dSPaolo Bonzini ARM_PAGE_SIZE); 75751a7a5dSPaolo Bonzini machine->obj.get_device = imx25_pdk_get_device; 76751a7a5dSPaolo Bonzini machine->obj.get_driver = imx25_pdk_get_driver; 77751a7a5dSPaolo Bonzini machine->obj.destructor = imx25_pdk_destructor; 78751a7a5dSPaolo Bonzini 79751a7a5dSPaolo Bonzini imx_i2c_init(&machine->i2c_1, qts, 0x43f80000); 80751a7a5dSPaolo Bonzini return &machine->obj; 81751a7a5dSPaolo Bonzini } 82751a7a5dSPaolo Bonzini 83751a7a5dSPaolo Bonzini static void imx25_pdk_register_nodes(void) 84751a7a5dSPaolo Bonzini { 85751a7a5dSPaolo Bonzini QOSGraphEdgeOptions edge = { 86751a7a5dSPaolo Bonzini .extra_device_opts = "bus=i2c-bus.0" 87751a7a5dSPaolo Bonzini }; 88751a7a5dSPaolo Bonzini qos_node_create_machine("arm/imx25-pdk", qos_create_machine_arm_imx25_pdk); 89751a7a5dSPaolo Bonzini qos_node_contains("arm/imx25-pdk", "imx.i2c", &edge, NULL); 90751a7a5dSPaolo Bonzini } 91751a7a5dSPaolo Bonzini 92751a7a5dSPaolo Bonzini libqos_init(imx25_pdk_register_nodes); 93