1f5fbb83fSMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0 */ 29d4fa1a1SMauro Carvalho Chehab /* 39d4fa1a1SMauro Carvalho Chehab * Support for Intel Camera Imaging ISP subsystem. 49d4fa1a1SMauro Carvalho Chehab * Copyright (c) 2015, Intel Corporation. 59d4fa1a1SMauro Carvalho Chehab * 69d4fa1a1SMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify it 79d4fa1a1SMauro Carvalho Chehab * under the terms and conditions of the GNU General Public License, 89d4fa1a1SMauro Carvalho Chehab * version 2, as published by the Free Software Foundation. 99d4fa1a1SMauro Carvalho Chehab * 109d4fa1a1SMauro Carvalho Chehab * This program is distributed in the hope it will be useful, but WITHOUT 119d4fa1a1SMauro Carvalho Chehab * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 129d4fa1a1SMauro Carvalho Chehab * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 139d4fa1a1SMauro Carvalho Chehab * more details. 149d4fa1a1SMauro Carvalho Chehab */ 159d4fa1a1SMauro Carvalho Chehab 169d4fa1a1SMauro Carvalho Chehab #ifndef __ASSERT_SUPPORT_H_INCLUDED__ 179d4fa1a1SMauro Carvalho Chehab #define __ASSERT_SUPPORT_H_INCLUDED__ 189d4fa1a1SMauro Carvalho Chehab 199d4fa1a1SMauro Carvalho Chehab /** 209d4fa1a1SMauro Carvalho Chehab * The following macro can help to test the size of a struct at compile 219d4fa1a1SMauro Carvalho Chehab * time rather than at run-time. It does not work for all compilers; see 229d4fa1a1SMauro Carvalho Chehab * below. 239d4fa1a1SMauro Carvalho Chehab * 249d4fa1a1SMauro Carvalho Chehab * Depending on the value of 'condition', the following macro is expanded to: 259d4fa1a1SMauro Carvalho Chehab * - condition==true: 269d4fa1a1SMauro Carvalho Chehab * an expression containing an array declaration with negative size, 279d4fa1a1SMauro Carvalho Chehab * usually resulting in a compilation error 289d4fa1a1SMauro Carvalho Chehab * - condition==false: 299d4fa1a1SMauro Carvalho Chehab * (void) 1; // C statement with no effect 309d4fa1a1SMauro Carvalho Chehab * 319d4fa1a1SMauro Carvalho Chehab * example: 329d4fa1a1SMauro Carvalho Chehab * COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) != SIZE_OF_HOST_SP_QUEUES_STRUCT); 339d4fa1a1SMauro Carvalho Chehab * 349d4fa1a1SMauro Carvalho Chehab * verify that the macro indeed triggers a compilation error with your compiler: 359d4fa1a1SMauro Carvalho Chehab * COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) != (sizeof(struct host_sp_queues)+1) ); 369d4fa1a1SMauro Carvalho Chehab * 379d4fa1a1SMauro Carvalho Chehab * Not all compilers will trigger an error with this macro; use a search engine to search for 389d4fa1a1SMauro Carvalho Chehab * BUILD_BUG_ON to find other methods. 399d4fa1a1SMauro Carvalho Chehab */ 409d4fa1a1SMauro Carvalho Chehab #define COMPILATION_ERROR_IF(condition) ((void)sizeof(char[1 - 2 * !!(condition)])) 419d4fa1a1SMauro Carvalho Chehab 429d4fa1a1SMauro Carvalho Chehab /* Compile time assertion */ 439d4fa1a1SMauro Carvalho Chehab #ifndef CT_ASSERT 449d4fa1a1SMauro Carvalho Chehab #define CT_ASSERT(cnd) ((void)sizeof(char[(cnd) ? 1 : -1])) 459d4fa1a1SMauro Carvalho Chehab #endif /* CT_ASSERT */ 469d4fa1a1SMauro Carvalho Chehab 479d4fa1a1SMauro Carvalho Chehab #include <linux/bug.h> 489d4fa1a1SMauro Carvalho Chehab 499d4fa1a1SMauro Carvalho Chehab /* TODO: it would be cleaner to use this: 509d4fa1a1SMauro Carvalho Chehab * #define assert(cnd) BUG_ON(cnd) 519d4fa1a1SMauro Carvalho Chehab * but that causes many compiler warnings (==errors) under Android 529d4fa1a1SMauro Carvalho Chehab * because it seems that the BUG_ON() macro is not seen as a check by 539d4fa1a1SMauro Carvalho Chehab * gcc like the BUG() macro is. */ 549d4fa1a1SMauro Carvalho Chehab #define assert(cnd) \ 559d4fa1a1SMauro Carvalho Chehab do { \ 569d4fa1a1SMauro Carvalho Chehab if (!(cnd)) \ 579d4fa1a1SMauro Carvalho Chehab BUG(); \ 589d4fa1a1SMauro Carvalho Chehab } while (0) 599d4fa1a1SMauro Carvalho Chehab 609d4fa1a1SMauro Carvalho Chehab #ifndef PIPE_GENERATION 619d4fa1a1SMauro Carvalho Chehab /* Deprecated OP___assert, this is still used in ~1000 places 629d4fa1a1SMauro Carvalho Chehab * in the code. This will be removed over time. 639d4fa1a1SMauro Carvalho Chehab * The implementation for the pipe generation tool is in see support.isp.h */ 649d4fa1a1SMauro Carvalho Chehab #define OP___assert(cnd) assert(cnd) 659d4fa1a1SMauro Carvalho Chehab compile_time_assert(unsigned int cond)669d4fa1a1SMauro Carvalho Chehabstatic inline void compile_time_assert(unsigned int cond) 679d4fa1a1SMauro Carvalho Chehab { 689d4fa1a1SMauro Carvalho Chehab /* Call undefined function if cond is false */ 699d4fa1a1SMauro Carvalho Chehab void _compile_time_assert(void); 709d4fa1a1SMauro Carvalho Chehab if (!cond) _compile_time_assert(); 719d4fa1a1SMauro Carvalho Chehab } 729d4fa1a1SMauro Carvalho Chehab #endif /* PIPE_GENERATION */ 739d4fa1a1SMauro Carvalho Chehab 749d4fa1a1SMauro Carvalho Chehab #endif /* __ASSERT_SUPPORT_H_INCLUDED__ */ 75